extends Node
# 玩家死亡原因记录
var death_reason = "you died"
# ===========================================
# 存档系统核心配置
# ===========================================
# 存档文件保存路径 - 使用user://表示用户数据目录
var save_path = "user://savegame.json"
# ===========================================
# 存档函数 - 保存游戏完整状态
# ===========================================
func save_game():
	# 获取玩家节点 - 使用组(group)来快速定位玩家
	var player = get_tree().get_first_node_in_group("player")
	if not player:
		push_error("存档失败: 找不到玩家节点")
		return
	# 获取当前场景引用
	var current_scene = get_tree().current_scene
	# ===========================================
	# 构建存档数据结构
	# ===========================================
	# 使用字典存储所有需要保存的游戏数据
	var save_data = {
		"player": {  # 玩家基础状态
			"health": player.health,      # 生命值
			"hunger": player.hunger,      # 饥饿值
			"position": {                 # 位置坐标
				"x": player.global_position.x,
				"y": player.global_position.y
			}
		},
		"inventory": [],              # 背包物品数组（动态填充）
		"current_map": current_scene.scene_file_path,  # 当前地图场景路径
		"map_items": []               # 地图物品数组（动态填充）
	}
	# ===========================================
	# 保存背包物品数据
	# ===================================
	# 遍历玩家背包的所有槽位
	for slot in player.inventory.slots:
		# 只保存有物品的槽位
		if slot.item:
			save_data.inventory.append({
				# 使用资源文件名作为标识（去掉.tres后缀）
				"item_name": slot.item.resource_path.get_file().replace(".tres", ""),
				"amount": slot.amount  # 物品数量
			})
	# ===========================================
	# 保存地图物品状态
	# ===================================
	# 查找场景中所有StaticBody2D类型的节点（包括蘑菇、花朵等可收集物品）
	var collectable_nodes = []
	collectable_nodes.append_array(current_scene.find_children("*", "StaticBody2D"))
	# 遍历所有找到的节点
	for node in collectable_nodes:
		# 通过检查是否有playercollect方法来判断是否为可收集物品
		if node.has_method("playercollect"):
			# 保存物品的详细信息
			save_data.map_items.append({
				"name": node.name,           # 节点名称（唯一标识）
				"position": {                # 位置坐标
					"x": node.position.x,
					"y": node.position.y
				}
			})
	# ===========================================
	# 写入存档文件
	# ===================================
	var file = FileAccess.open(save_path, FileAccess.WRITE)
	if file:
		# 将数据转换为JSON字符串并保存
		file.store_string(JSON.stringify(save_data))
		print("游戏已保存! 地图上剩余物品数: ", save_data.map_items.size())
	else:
		push_error("存档失败: ", FileAccess.get_open_error())
# ===========================================
# 读档函数 - 恢复游戏完整状态
# ===========================================
func load_game():
	# ===========================================
	# 读取存档文件
	# ===========================================
	var file = FileAccess.open(save_path, FileAccess.READ)
	if not file:
		push_error("读档失败: 找不到存档文件")
		return false
	# 读取文件内容
	var json_string = file.get_as_text()
	file.close()
	# ===========================================
	# 解析JSON数据
	# ===========================================
	var json = JSON.new()
	var parse_result = json.parse(json_string)
	if parse_result != OK:
		push_error("读档失败: JSON解析错误")
		return false
	
	var save_data = json.data
	# ===========================================
	# 切换到存档时的地图场景
	# ===========================================
	if save_data.has("current_map"):
		get_tree().change_scene_to_file(save_data.current_map)
	
	# 等待场景加载完成（短暂延迟确保场景完全加载）
	await get_tree().create_timer(0.1).timeout
	# ===========================================
	# 获取当前场景和玩家节点
	# ===========================================
	var current_scene = get_tree().current_scene
	var player = get_tree().get_first_node_in_group("player")
	# ===========================================
	# 恢复玩家状态
	# ===========================================
	if player and save_data.has("player"):
		# 恢复基础属性
		player.health = save_data.player.health
		player.hunger = save_data.player.hunger
		# 恢复位置
		player.global_position = Vector2(
			save_data.player.position.x,
			save_data.player.position.y
		)
		# 更新UI显示
		player.update_stats()
		# ===========================================
		# 清空并恢复背包物品
		# ===================================
		# 先清空现有背包
		for slot in player.inventory.slots:
			slot.item = null
			slot.amount = 0
		# 恢复背包物品
		if save_data.has("inventory"):
			for item_data in save_data.inventory:
				# 根据文件名重新加载物品资源
				var item_path = "res://resource/" + item_data.item_name + ".tres"
				var item = ResourceLoader.load(item_path)
				if item:
					# 逐个插入物品到背包
					for i in range(item_data.amount):
						player.inventory.insert(item)
		# ===========================================
		# 恢复地图物品状态
		# ===================================
		if save_data.has("map_items"):
			# 获取当前场景中所有可收集物品
			var collectable_nodes = []
			collectable_nodes.append_array(current_scene.find_children("*", "StaticBody2D"))
			# 创建存档中物品名称的列表（用于快速查找）
			var saved_item_names = []
			for item_data in save_data.map_items:
				saved_item_names.append(item_data.name)
			
			# 遍历当前场景中的所有可收集物品
			for node in collectable_nodes:
				if node.has_method("playercollect"):  # 确认是可收集物品
					# 如果当前物品不在存档列表中，说明已被收集，需要移除
					if not (node.name in saved_item_names):
						node.queue_free()  # 从场景中移除
			print("地图物品已恢复! 剩余物品数: ", save_data.map_items.size())
		print("游戏已读取!")
		return true
	return false
